package com.gp.base.util;

import java.util.Map;

import javax.servlet.http.HttpServletRequest;

import org.ecside.table.limit.FilterSet;
import org.ecside.table.limit.Limit;
import org.ecside.table.limit.Sort;
import org.ecside.util.ECSideUtils;
import org.ecside.util.RequestUtils;

/**
 * 
 * <li>类型名称：
 * <li>说明：ecside 专用
 * <li>需要将当前数据的总条数设置给ecside的limit对象
 * <li>创建人： 曾明辉
 * <li>创建日期：2008-10-14
 * <li>修改人：
 * <li>修改日期：
 */
public class ECPage {
	private final static int DEFAULT_PAGE_SIZE = 20;
	private int totalRows; // 总行数 外部业务层设入
	private int currentPage; // 当前页号 外部参数包装层设入
	private int totalPages; // 总页数 计算得到
	private int startRow; // 当前页在数据库中的起始行 计算得到
	private int endRow; // 当前页在数据库中的最后行 计算得到
	private int displayRowsNum = DEFAULT_PAGE_SIZE;// 当前页所显示的数据数量，如果当前页不是最后一页，那么当前页显示的数据行数就等于当前页的大小

	@SuppressWarnings("unchecked")
	private Map sortMap = null;// 数据的排列Map，外部传入
	@SuppressWarnings("unchecked")
	private Map condition = null;// 数据的过滤条件，外部传入
	private String orderString = null;
	private Limit limit; // 由于该处外部参数传入是用Ecside实现，这里做一个代理。

	/**
	 * 
	 * <li>方法名：getInstance
	 * <li>
	 * 
	 * @param name
	 *            <li>
	 * @return
	 *            <li>返回类型：Grid
	 *            <li>说明：
	 *            <li>创建人：曾明辉
	 *            <li>创建日期：2008-10-14
	 *            <li>修改人：
	 *            <li>修改日期：
	 */
	public static ECPage getInstance(String name, HttpServletRequest request) {
		return new ECPage(name, request);
	}
	
	public ECPage getInstance(String name, HttpServletRequest request, int displayRowsNum) {
		this.displayRowsNum = displayRowsNum;
		return new ECPage(name, request);
	}
	
	/**
	 * 
	 * <li>说明：
	 * <li>创建人：曾明辉
	 * <li>创建日期：2008-10-14
	 * <li>修改人：
	 * <li>修改日期：
	 */
	public ECPage(String name, HttpServletRequest request) {
		if (name != null) {
			limit = RequestUtils.getLimit(request, name);
		} else {
			limit = RequestUtils.getLimit(request);
		}

		Sort sort = limit.getSort();
		sortMap = sort.getSortValueMap();

		FilterSet filterSet = limit.getFilterSet();
		condition = filterSet.getPropertyValueMap();

		totalRows = RequestUtils.getTotalRowsFromRequest(request);
		if (totalRows > 0) {
			// 将记录的总数设置回EcSide
			limit.setRowAttributes(totalRows, limit.getCurrentRowsDisplayed());
		} else {
			// 需要设置数据新的行数，这里交给业务层完成。
		}
	}
	
	/**
	 * 
	 * <li>说明：
	 * <li>创建人：曾明辉
	 * <li>创建日期：2010-9-6
	 * <li>修改人： 
	 * <li>修改日期：
	 */
	public ECPage(String name, HttpServletRequest request, int displayRowsNum) {
		this.displayRowsNum = displayRowsNum;
		new ECPage(name, request);
	}

	/**
	 * 
	 * <li>说明：该方法为通用方法，外部只需要传入总行数，每页大小，当前的页号，程序将自动能够计算并获取数据，并将数据回填充到以name为名称的控件中。
	 * <li>但目前暂时不用
	 * <li>创建人：曾明辉
	 * <li>创建日期：2008-10-14
	 * <li>修改人：
	 * <li>修改日期：
	 */
	public ECPage(String name, int totalRow, int pageSize, int pageNo) {
		this.totalRows = totalRow;
		this.currentPage = pageNo;
	}

	/**
	 * 
	 * <li>方法名：setTotalRows
	 * <li>
	 * 
	 * @param rowsnum
	 *            <li>返回类型：void
	 *            <li>说明：
	 *            <li>创建人：曾明辉
	 *            <li>创建日期：2008-10-14
	 *            <li>修改人：
	 *            <li>修改日期：
	 */
	public void setTotalRows(int rowsnum) {
		this.totalRows = rowsnum;
		// 将记录的总数设置回EcSide
		// limit.setRowAttributes(this.totalRows, 3);
		// 根据limit传入的参数，自动计算当前页以及每页的大小。
		if (limit.getCurrentRowsDisplayed() == 0) {
			displayRowsNum = DEFAULT_PAGE_SIZE;
		} else {
			displayRowsNum = limit.getCurrentRowsDisplayed();
		}

		limit.setRowAttributes(this.totalRows, displayRowsNum);
		totalPages = totalRows / displayRowsNum;
		int mod = totalRows % displayRowsNum;
		if (mod > 0) {
			totalPages++;
		}
		startRow = limit.getRowStart();
		endRow = limit.getRowEnd();
		currentPage = limit.getPage();
	}

	/**
	 * 
	 * <li>方法名：getSort
	 * <li>
	 * 
	 * @return
	 * <li>返回类型：Map
	 * <li>说明：
	 * <li>创建人：曾明辉
	 * <li>创建日期：2008-10-14
	 * <li>修改人：
	 * <li>修改日期：
	 */
	@SuppressWarnings("unchecked")
	public Map getSort() {
		return this.sortMap;
	}

	/**
	 * 
	 * <li>方法名：getFilterMap
	 * <li>
	 * 
	 * @return
	 * <li>返回类型：Map
	 * <li>说明：
	 * <li>创建人：曾明辉
	 * <li>创建日期：2008-10-14
	 * <li>修改人：
	 * <li>修改日期：
	 */
	@SuppressWarnings("unchecked")
	public Map getFilterMap() {
		return this.condition;
	}

	/**
	 * 
	 * <li>方法名：getStartRow
	 * <li>
	 * 
	 * @return
	 * <li>返回类型：int
	 * <li>说明：
	 * <li>创建人：曾明辉
	 * <li>创建日期：2008-10-14
	 * <li>修改人：
	 * <li>修改日期：
	 */
	public int getStartRow() {
		return startRow + 1;
	}

	/**
	 * 
	 * <li>方法名：getEndRow
	 * <li>
	 * 
	 * @return
	 * <li>返回类型：int
	 * <li>说明：
	 * <li>创建人：曾明辉
	 * <li>创建日期：2008-10-14
	 * <li>修改人：
	 * <li>修改日期：
	 */
	public int getEndRow() {
		return endRow;
	}

	/**
	 * 
	 * <li>方法名：getDisplayRowsNum
	 * <li>
	 * 
	 * @return
	 * <li>返回类型：int
	 * <li>说明：
	 * <li>创建人：曾明辉
	 * <li>创建日期：2008-10-14
	 * <li>修改人：
	 * <li>修改日期：
	 */
	public int getDisplayRowsNum() {
		return displayRowsNum;
	}

	
	public void setDisplayRowsNum(int displayRowsNum) {
		this.displayRowsNum = displayRowsNum;
	}

	/**
	 * 
	 * <li>方法名：getTotalPages
	 * <li>
	 * 
	 * @return
	 * <li>返回类型：int
	 * <li>说明：
	 * <li>创建人：曾明辉
	 * <li>创建日期：2008-10-14
	 * <li>修改人：
	 * <li>修改日期：
	 */
	public int getTotalPages() {
		return totalPages;
	}
	
	/**
	 * 
	 * @param currentPage
	 */
	public void setCurrentPage(int currentPage) {
		this.currentPage = currentPage;
	}

	/**
	 * 
	 * <li>方法名：getCurrentPage
	 * <li>
	 * 
	 * @return
	 * <li>返回类型：int
	 * <li>说明：
	 * <li>创建人：曾明辉
	 * <li>创建日期：2008-10-14
	 * <li>修改人：
	 * <li>修改日期：
	 */
	public int getCurrentPage() {
		return currentPage;
	}

	/**
	 * 
	 * <li>方法名：getTotalRows
	 * <li>
	 * 
	 * @return
	 * <li>返回类型：int
	 * <li>说明：
	 * <li>创建人：曾明辉
	 * <li>创建日期：2008-10-14
	 * <li>修改人：
	 * <li>修改日期：
	 */
	public int getTotalRows() {
		return totalRows;
	}

	/**
	 * 
	 * <li>方法名：first
	 * <li>
	 * <li>返回类型：void
	 * <li>说明：
	 * <li>创建人：曾明辉
	 * <li>创建日期：2008-10-14
	 * <li>修改人：
	 * <li>修改日期：
	 */
	public void first() {
		currentPage = 1;
		startRow = 0;
	}

	/**
	 * 
	 * <li>方法名：previous
	 * <li>
	 * <li>返回类型：void
	 * <li>说明：
	 * <li>创建人：曾明辉
	 * <li>创建日期：2008-10-14
	 * <li>修改人：
	 * <li>修改日期：
	 */
	public void previous() {
		if (currentPage == 1) {
			return;
		}
		currentPage--;
		startRow = (currentPage - 1) * displayRowsNum;
	}

	/**
	 * 
	 * <li>方法名：next
	 * <li>
	 * <li>返回类型：void
	 * <li>说明：
	 * <li>创建人：曾明辉
	 * <li>创建日期：2008-10-14
	 * <li>修改人：
	 * <li>修改日期：
	 */
	public void next() {
		if (currentPage < totalPages) {
			currentPage++;
		}
		startRow = (currentPage - 1) * displayRowsNum;
	}

	/**
	 * 
	 * <li>方法名：last
	 * <li>
	 * <li>返回类型：void
	 * <li>说明：
	 * <li>创建人：曾明辉
	 * <li>创建日期：2008-10-14
	 * <li>修改人：
	 * <li>修改日期：
	 */
	public void last() {
		currentPage = totalPages;
		startRow = (currentPage - 1) * displayRowsNum;
	}

	/**
	 * 
	 * <li>方法名：refresh
	 * <li>
	 * 
	 * @param _currentPage
	 *            <li>返回类型：void
	 *            <li>说明：
	 *            <li>创建人：曾明辉
	 *            <li>创建日期：2008-10-14
	 *            <li>修改人：
	 *            <li>修改日期：
	 */
	public void refresh(int _currentPage) {
		currentPage = _currentPage;
		if (currentPage > totalPages) {
			last();
		}
	}

	/**
	 * 
	 * <li>方法名：gotoPage
	 * <li>
	 * <li>返回类型：void
	 * <li>说明：
	 * <li>创建人：曾明辉
	 * <li>创建日期：2008-10-14
	 * <li>修改人：
	 * <li>修改日期：
	 */
	public void gotoPage() {
		if (currentPage < 1)
			first();
		else if (currentPage > totalPages)
			last();
		startRow = (currentPage - 1) * displayRowsNum;
	}

	/**
	 * 
	 * <li>方法名：gotoPage
	 * <li>
	 * 
	 * @param _currentPage
	 *            <li>返回类型：void
	 *            <li>说明：
	 *            <li>创建人：曾明辉
	 *            <li>创建日期：2008-10-14
	 *            <li>修改人：
	 *            <li>修改日期：
	 */
	public void gotoPage(int _currentPage) {
		if (_currentPage < 1)
			first();
		else if (_currentPage > totalPages)
			last();
		startRow = (_currentPage - 1) * displayRowsNum;
	}

	//	
	// /**
	// *
	// * <li>方法名：getData
	// * <li>@param daoUtils
	// * <li>@param sql
	// * <li>@return
	// * <li>返回类型：Collection
	// * <li>说明：
	// * <li>创建人：曾明辉
	// * <li>创建日期：2008-10-14
	// * <li>修改人：
	// * <li>修改日期：
	// */
	// public Collection getData(BaseDao baseDao,String sql){
	// int count = baseDao.getCount(sql);
	// this.setTotalRows(count);
	//		
	// if(sql.toLowerCase().indexOf("order") <= -1){
	// sql += this.getOrderString();
	// }
	// Collection dataList = baseDao.findPage(sql, this.getCurrentPage(),
	// this.getDisplayRowsNum());
	// return dataList;
	// }
	//	
	// /**
	// *
	// * <li>方法名：getData
	// * <li>@param daoUtils
	// * <li>@param entity
	// * <li>@param orderString
	// * <li>@return
	// * <li>返回类型：Collection
	// * <li>说明：
	// * <li>创建人：曾明辉
	// * <li>创建日期：2008-10-14
	// * <li>修改人：
	// * <li>修改日期：
	// */
	// public Collection getData(BaseDao baseDao,Object entity,String
	// orderString){
	// int count = baseDao.getCount(entity);
	// this.setTotalRows(count);
	// if(orderString == null){
	// orderString = ECSideUtils.getDefaultSortSQL(sortMap);
	// }
	// Collection dataList = baseDao.findByEntity(entity, this.getCurrentPage(),
	// this.getDisplayRowsNum(),orderString);
	// return dataList;
	// }
	//	
	// /**
	// * <li>方法名：getData
	// * <li>@param daoUtils
	// * <li>@param entity 持久化模板对象
	// * <li>@param alias 对象别名，与附加HQL语句中应一致
	// * <li>@param addHql 附加HQL查询条件语句，必须有where关键字
	// * <li>@param params 附加HQL查询条件语句中需要的参数
	// * <li>@return 对象LIst集合
	// * <li>返回类型：Collection
	// * <li>说明：通过查询模板对象的持久化字符及数字字段做为条件与附加HQL语句一起组成HQL
	// * <li>注意：字符默认按模糊条件查询，数字默认进行精确查询
	// * <li>创建人：曾明辉
	// * <li>创建日期：2008-11-20
	// * <li>修改人：
	// * <li>修改日期：
	// */
	// public Collection getData(BaseDao baseDao,Object entity,final String
	// alias,
	// final String addHql, final Object... params){
	// String hql = baseDao.buildHql(entity, alias, addHql);
	// int count = baseDao.getCount(hql,params);
	// this.setTotalRows(count);
	//		
	// if(hql.toLowerCase().indexOf("order") <= -1){
	// hql += this.getOrderString();
	// }
	//		
	// Collection dataList = baseDao.findPage(hql,params, this.getCurrentPage(),
	// this.getDisplayRowsNum());
	// return dataList;
	// }
	//	
	 /**
	 *
	 * <li>方法名：getOrderString
	 * <li>@return
	 * <li>返回类型：String
	 * <li>说明：
	 * <li>创建人：尹旭
	 * <li>创建日期：2008-11-22
	 * <li>修改人：
	 * <li>修改日期：
	 */
	 public String getOrderString(){
		 String ecOrderString = ECSideUtils.getDefaultSortSQL(sortMap);
		 if(ecOrderString == null || ecOrderString.length() <= 0){
		 if(orderString == null || orderString.length() <= 0){
		 return "";
		 }else{
		 return this.orderString;
		 }
		 }else{
		 return ecOrderString;
		 }
	 }
		
	/**
	 * 
	 * <li>方法名：setOrderString
	 * <li>
	 * 
	 * @param orderString
	 *            <li>返回类型：void
	 *            <li>说明：
	 *            <li>创建人：尹旭
	 *            <li>创建日期：2008-11-22
	 *            <li>修改人：
	 *            <li>修改日期：
	 */
	public void setOrderString(String orderString) {
		this.orderString = orderString;
	}
}
